// 版权所有2011 Go作者。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

/*
Package user allows user account lookups by name or id.

For most Unix systems, this package has two internal implementations of
resolving user and group ids to names. One is written in pure Go and
parses /etc/passwd and /etc/group. The other is cgo-based and relies on
the standard C library (libc) routines such as getpwuid_r and getgrnam_r.

When cgo is available, cgo-based (libc-backed) code is used by default.
This can be overridden by using osusergo build tag, which enforces
the pure Go implementation.
*/
package user

import (
	"strconv"
)

var (
	userImplemented  = true // 通过查找存根设置为false。go的init 
	groupImplemented = true // 通过查找存根设置为false。go的init 
)

// 用户表示用户帐户。
type User struct {
	// Uid是用户ID。
	// 在POSIX系统上，这是表示Uid的十进制数。
	// 在Windows上，这是一个字符串格式的安全标识符（SID）。
	// 在计划9中，这是/dev/user的内容。
	Uid string
	// Gid是主组ID。
	// 在POSIX系统上，这是表示Gid的十进制数。
	// 在Windows上，这是字符串格式的SID。
	// 在计划9中，这是/dev/user的内容。
	Gid string
	// 用户名是登录名。
	Username string
	// Name是用户的真实名称或显示名称。
	// 可能为空。
	// 在POSIX系统上，这是GECOS字段
	// 列表中的第一个（或唯一一个）条目。
	// 在Windows上，这是用户的显示名称。
	// 在计划9中，这是/dev/user的内容。
	Name string
	// HomeDir是用户主目录的路径（如果有）。
	HomeDir string
}

// 组表示一组用户。
// 
// 在POSIX系统上，Gid包含一个表示组ID的十进制数。
type Group struct {
	Gid  string // 组ID 
	Name string // 组名
}

// 当找不到用户时，LookupId将返回UnknownUserError。
type UnknownUserIdError int

func (e UnknownUserIdError) Error() string {
	return "user: unknown userid " + strconv.Itoa(int(e))
}

// 当找不到用户时，通过查找返回UnknownUserError。
type UnknownUserError string

func (e UnknownUserError) Error() string {
	return "user: unknown user " + string(e)
}

// 当找不到组时，LookupGroupId返回UnknownGroupId错误。
type UnknownGroupIdError string

func (e UnknownGroupIdError) Error() string {
	return "group: unknown groupid " + string(e)
}

// 当找不到组时，LookupGroup返回UnknownGroupError。
type UnknownGroupError string

func (e UnknownGroupError) Error() string {
	return "group: unknown group " + string(e)
}
